// 权限控制文件

// console.log('权限控制文件')

// 引入router store
import router from '@/router'
import store from '@/store'

// 引入进度条
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式

// 导入动态路由表(包含所有可选的未经过过滤的路由列表)
import { asyncRoutes } from '@/router'
// console.log('所有的动态路由表', asyncRoutes)

// start()开始显示进度条 done()结束进度条
// 路由全局前置导航守卫

const whiteList = ['/login', '/404'] // 定义白名单  所有不受权限控制的页面

router.beforeEach(async(to, from, next) => {
  // to and from are Route Object,next() must be called to resolve the hook}
  // to:目标路由对象 去哪里
  // from:来源路由对象 从哪里来
  // next:放行方法
  // 开启跳转进度条
  NProgress.start()
  const token = store.getters.token
  // token存在
  if (token) {
    // 有token
    if (to.path === '/login') {
      // 如有有token 如果登录了 跳转到首页
      next('/')
    } else {
      // 有token但是不是去登录页 直接放行
      // 保证token是有的 调用action获取权限数据(个人信息数据) 往后要进行放行 进入首页
      // 在这里调用action函数
      // 用户信息获取到之后 存入vuex中有数据 切换路由的时候就不需要重复调用
      if (!store.state.user.userInfo.userId) {
        // await store.dispatch('user/asyncGetUserInfo')
        const res = await store.dispatch('user/asyncGetUserInfo')
        // 拿到菜单权限数据
        const menus = res.roles.menus
        // 以菜单权限数据为主对动态路由表做过滤处理 筛选出符合条件的项
        // 1. filter  2.动态路由表中如果某一项它的children属性中的第一项的name能在menus中找到
        const filterRoutes = asyncRoutes.filter(item => {
          return menus.includes(item.children[0].name)
        })
        // console.log('当前传出来的接口数据为', menus)
        // console.log('过滤之后的动态路由表', filterRoutes)
        // 调用mutation函数 把动态路由表添加到menuList
        store.commit('menu/setMenuList', filterRoutes)
        // 因为动态路由表需要做权限控制 我们在初始化的时候只初始化静态的 而这个动态的我们在做完过滤之后
        // 再添加进去
        router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }])

        // 修复刷新白屏bug
        // 在路由动态添加之后 模拟了一下重新进入路由
        // 因为动态路由表的生成是需要通过调用接口经过筛选才有的
        // 刷新的时候 立刻就想进入路由 但是没有生成
        // 所以在addRoutes之后也就是正式生成之后  把之前本来想去往的路由再重新进入一遍
        next({
          ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
          replace: true // 覆盖上一次的记录
        })
        return
      }
      next()
    }
  } else {
    // 没有token
    // 是否在白名单内
    // 如果在白名单内
    if (whiteList.includes(to.path)) {
      next()
    } else {
      // 不在白名单内 跳回到登录页
      next('/login')
    }
  }
  // 结束
  NProgress.done()
})
